package ba04_AfterThrowing;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @author HLF
 * @version V1.0
 * @package ba01
 * @date 2021/10/17 10:19
 * @Aspect 是aspectj框架的注解，表示当前类是切面类
 * 切面类：用来给业务方法增加功能的类，在这个类中有增加切面功能的代码
 * 位置：在切面类定义的上面
 */
@Aspect
@Component//创建切面类对象
public class MyAspect {

    /**
     * 定义方法，方法是实现切面功能的。
     * 方法的定义要求：
     *      1.公共方法 public
     *      2.方法没有返回值
     *      3.方法名称自定义
     *      4.方法有参数Exception类型，也可以有JoinPoint类型参数
     */
    /**
     * @AfterThrowing:异常通知
     *     属性：1. value 切入点表达式
     *          2. throwing 自定义的变量，表示目标方法抛出的异常对象。
     *             变量名必须和方法的参数名一样
     * 特点：
     *   1. 在目标方法抛出异常时执行的
     *   2. 可以做异常的监控程序， 监控目标方法执行时是不是有异常。
     *      如果有异常，可以发送邮件，短信进行通知
     *
     *  执行就是：
     *   try{
     *       SomeServiceImpl.doSecond(..)
     *   }catch(Exception e){
     *       myAfterThrowing(e);
     *   }
     */

    @AfterThrowing(value = "execution(* *..SomeServiceImpl.doSecond(..))",throwing = "e")
    public void myAfterThrowing(JoinPoint joinPoint,Exception e){
        System.out.println("异常通知：发生异常时执行："+e.getMessage());
        //发送邮件、短信通知开发人员
    }
}
